堆栈的基本概念
堆栈是一种特殊的线性表,其数据元素以及数据元素间的逻辑关系和线性表的完全相同,其差别是:线性表允许在任意位置插入和删除数据元素,而堆栈只允许在固定一端进行插入和删除数据元素操作。
堆栈中允许进行插入和删除操作的一端成为栈顶,另一端成为栈底;最后进入堆栈的数据元素总是最先退出堆栈,因此堆栈也称作后进先出的线性表。
堆栈的顺序表示和实现(顺序堆栈)
1.顺序堆栈的存储结构
定义结构体如下:
typedef struct
{
DataType stack[MaxStackSize];
int top;
} SeqStack;
2.顺序堆栈的操作实现
1.初始化
void StackInitiate(SeqStack *S)
{
S->top = 0; //初始化栈顶下标值(相当于数据元素个数)
}
2.判断非空否
int StackNotEmpty(SeqStack S)
//非空返回1,空返回0。
{
if(S.top <= 0)return 0;
else return 1;
}
3.入栈
int StackPush(SeqStack *S, DataType x)
//把数据元素值x存入顺序堆栈S中,成功返回1,失败返回0。
{
if(S->top >= MaxStackSize)
{
printf("堆栈已满,无法入栈!");
return 0;
}
else
{
S->stack[S->top] = x;
S->top ++;
return 1;
}
}
4.出栈
int StackPop(SeqStack *S, DataType *d)
//取出的栈顶数据元素值由参数d带回,成功返回1,失败返回0。
{
if(S->top <= 0)
{
printf("堆栈已空!");
return 0;
}
else
{
S->top --;
*d = S->stack[S->top];
return 1;
}
}
5.取栈顶数据元素
int StackTop(SeqStack S, DataType *d)
{
if(S.top <= 0)
{
printf("堆栈已空!");
return 0;
}
else
{
*d = S.stack[S.top -1];
return 1;
}
}
堆栈的链式表示和实现(链式堆栈)
1.链式堆栈的存储结构
结点结构体定义如下:
typedef struct snode
{
DataType data;
struct snode *next;
} LSNode;
2.链式堆栈的操作实现
1.初始化
void StackInitiate(LSNode **head)
//初始化带头结点链式堆栈
{
*head = (LSNode *)malloc(sizeof(LSNode));
(*head)->next = NULL;
}
2.判断非空否
int StackNotEmpty(LSNode *head)
{
if(head->next == NULL)return 0;
else return 1;
}
3.入栈
void StackPush(LSNode *head, DataType x)
{
LSNode *p;
p = (LSNode *)malloc(sizeof(LSNode));
p->data = x;
p->next = head->next;
head->next = p;
}
4.出栈
int StackPop(LSNode *head, DataType *d)
{
LSNode *p = head->next;
if(p == NULL)
{
printf("堆栈已空!");
return 0;
}
head->next = p->next;
*d = p->data;
free(p);
return 1;
}
5.取栈顶数据元素
int StackTop(LSNode *head, DataType *d)
{
LSNode *p = head->next;
if(p == NULL)
{
printf("堆栈已空!");
return 0;
}
*d = p->data;
return 1;
}
6.撤销动态申请空间
void Destory(LSNode *head)
{
LSNode *p, *p1;
p = head;
while(p!=NULL)
{
p1 = p;
p = p->next;
free(p1);
}
}